home *** CD-ROM | disk | FTP | other *** search
- PROGRAM GUARD;
-
-
- CONST
-
- ONE = 1.0;
- HALF = 0.5;
- ZERO = 0.0;
- MINUSONE = -1.0;
-
-
- VAR
-
- RADIX : REAL;
- PRECISION : REAL;
- WIDTH : REAL;
- WIDE : REAL;
- ULPONE : REAL;
- ULPRADIX : REAL;
- ONEMINUS : REAL;
- RADIXMINUS : REAL;
- S,T,U :REAL;
- X,Y,Z :REAL;
-
-
- BEGIN {GUARD}
-
- WIDE := ONE;
- REPEAT
-
- WIDE := WIDE + WIDE;
- X := WIDE + ONE;
- Y := X - WIDE;
- Z := Y - ONE;
- UNTIL ( MINUSONE + ABS(Z)) >= ZERO;
-
-
- Y := ONE;
- REPEAT
-
-
- RADIX := WIDE + Y;
- Y := Y + Y;
- RADIX := RADIX - WIDE;
- UNTIL RADIX <> ZERO;
- WRITELN ('RADIX = ',RADIX);
-
-
-
- PRECISION := ZERO;
- WIDTH := ONE;
- REPEAT
-
-
- PRECISION := PRECISION + ONE;
- WIDTH := WIDTH * RADIX;
- Y := WIDTH + ONE;
- UNTIL ( Y - WIDTH ) <> ONE;
-
-
- WRITELN ('PRECISION = ',PRECISION );
- WRITELN ('WIDTH = ',WIDTH );
- ULPONE := ONE/WIDTH;
- WRITELN ('CLOSEST RELATIVE SEPERATION FOUND IS ULPONE = ',ULPONE );
-
-
- ONEMINUS := ( HALF - ULPONE ) + HALF;
- ULPRADIX := RADIX * ULPONE;
- RADIXMINUS := RADIX - ONE;
- RADIXMINUS := (RADIXMINUS - ULPRADIX ) + ONE;
-
-
- X := ONE - ULPONE;
- Y := ONE - ONEMINUS;
- Z := ONE - X;
- S := RADIX - ULPRADIX;
- T := RADIX - RADIXMINUS;
- U := RADIX - S;
-
-
- IF (Y = ULPONE) AND (Z = ULPONE)
- AND (T = ULPRADIX) AND (U = ULPRADIX)
- THEN WRITELN('ADD/SUBTRACT HAS A GUARD DIGIT AS IT SHOULD')
- ELSE
- WRITELN('ADD/SUBTRACT LACKS GUARD DIGIT, CANCELLATION OBSCURED')
-
- END {GUARD}.